package com.lijing.ThreadedBinaryTree;

/**
 * @Description 后序遍历线索化
 * @title: PostOrderThreadedBinaryTree
 * @Author LiJing
 * @Date: 2021/2/195:09 下午
 * @Version 1.0
 */
public class PostOrderThreadedBinaryTree {
    private HeroNode root;
    private HeroNode pre;

    public PostOrderThreadedBinaryTree() {
    }

    public PostOrderThreadedBinaryTree(HeroNode root) {
        this.root = root;
    }

    public void postOrderThreadedNodes(){
        this.postOrderThreadedNodes(root);
    }
    /**
     * 后序遍历线索化
     * @param node
     */
    public void postOrderThreadedNodes(HeroNode node){
        if (node == null){
            return;
        }
        /*
         * @Date: 2021/2/19 5:17 下午
         * Step 1: 线索化左子树
         */
        if (node.getLeftType() == 0){
            postOrderThreadedNodes(node.getLeft());
        }
        /*
         * @Date: 2021/2/19 5:19 下午
         * Step 2: 线索化右子树
         */
        if (node.getRightType() == 0){
            postOrderThreadedNodes(node.getRight());
        }
        /*
         * @Date: 2021/2/19 5:19 下午
         * Step 3: 线索化当前节点
         */
        if (node.getLeft() == null){
            node.setLeft(pre);
            node.setLeftType(1);
        }
        if (pre != null && pre.getRight() == null){
            pre.setRight(node);
            pre.setRightType(1);
        }
        pre = node;
    }

    /**
     * 重载遍历方法
     */
    public void postOrderList(){
        this.postOrderList(root);
    }

    /**
     * 后序遍历（递归）
     * @param node 带遍历的首节点
     */
    public void postOrderList(HeroNode node){
        /*
         * @Date: 2021/2/19 5:26 下午
         * Step 1: 遍历左子树
         */
        if (node.getLeft() != null && node.getLeftType() == 0){
            postOrderList(node.getLeft());
        }
        /*
         * @Date: 2021/2/19 5:27 下午
         * Step 2: 遍历右子树
         */
        if (node.getRight() != null && node.getRightType() == 0){
            postOrderList(node.getRight());
        }
        /*
         * @Date: 2021/2/19 5:28 下午
         * Step 3: 打印当前节点
         */
        System.out.println(node);
    }
}
